{
  "bundles": [
    {
      "@type": "NXBundle",
      "artifactId": "nuxeo-coldstorage",
      "artifactVersion": "2023.3.6",
      "bundleGroup": {
        "@type": "NXBundleGroup",
        "bundleIds": [
          "nuxeo-coldstorage-web",
          "org.nuxeo.coldstorage"
        ],
        "hierarchyPath": "/grp:org.nuxeo.coldstorage",
        "id": "grp:org.nuxeo.coldstorage",
        "name": "org.nuxeo.coldstorage",
        "parentIds": [],
        "readmes": [
          {
            "blobProviderId": "default",
            "content": "[![Build Status](https://jenkins.platform.dev.nuxeo.com/buildStatus/icon?job=coldstorage%2Fnuxeo-coldstorage%2Flts-2023)](https://jenkins.platform.dev.nuxeo.com/job/coldstorage/job/nuxeo-coldstorage/job/lts-2023/)\n\n# Nuxeo Cold Storage\n\nThe Nuxeo Cold Storage addon allows the storage of the document main content in a cold storage. This can be needed for archiving, compliance, etc.\n\nFor more details around functionalities, requirements, installation and usage please consider this addon [official documentation](https://doc.nuxeo.com/nxdoc/nuxeo-coldstorage/).\n\n## Context\nNuxeo Cold Storage is an addon that can be plugged to Nuxeo.\n\nIt is bundled as a marketplace package that includes all the backend and frontend contributions needed for [Nuxeo Platform](https://github.com/nuxeo/nuxeo) and [Nuxeo Web UI](https://github.com/nuxeo/nuxeo-web-ui).\n\n## Sub Modules Organization\n\n- **ci**: CI/CD files and configurations responsible to generate preview environments and running Cold Storage pipeline\n- **nuxeo-coldstorage**: Backend contribution for Nuxeo Platform\n- **nuxeo-coldstorage-package**: Builder for [nuxeo-coldstorage](https://connect.nuxeo.com/nuxeo/site/marketplace/package/nuxeo-coldstorage) marketplace package. This package will install all the necessary mechanisms to integrate Cold Storage capabilities into Nuxeo\n- **nuxeo-coldstorage-web**: Frontend contribution for Nuxeo Web UI\n\n## Build\n\nNuxeo's ecosystem is Java based and uses Maven. This addon is not an exception and can be built by simply performing:\n\n```shell script\nmvn clean install\n```\n\nThis will build all the modules except _ci_ and generate the correspondent artifacts: _`.jar`_ files for the contributions, and a _`.zip_ file for the package.\n\n## DB configuration\n\nCreate the following db indexes for an optimal functioning of the addon:\n - `coldstorage:beingRetrieved`\n - `coldstorage:coldContent/digest`\n - `file:content/digest`\n - `ecm:mixinTypes`\n\n Typically on MongoDB:\n ```\n db.default.createIndex(\n    { \"coldstorage:beingRetrieved\": 1 },\n    { partialFilterExpression: { \"coldstorage:beingRetrieved\": true } }\n );\n\n db.default.createIndex(\n    { \"content.digest\": 1 }\n );\n\n db.default.createIndex(\n    { \"coldstorage:coldContent.digest\": 1 }\n );\n\n db.default.createIndex(\n   { \"ecm:mixinTypes\": 1 }\n);\n ```\n\n## Configuration properties\n\n - `nuxeo.coldstorage.check.retrieve.state.cronExpression` :  cron expression to define the frequency of the execution of the process to check if a document has been retrieved. Default value is `0 7 * ? * * *` i.e. every hour at the 7th minute.\n - `nuxeo.bulk.action.checkColdStorageAvailability.scroller` : scroller implementation to be used to query documents being retrieved. `elastic` value can be set to relieve the regular back-end.\n - `nuxeo.coldstorage.numberOfDaysOfAvailability.value.default` : number of days a document remains available once it has been retrieved. Default value is `1`.\n - `nuxeo.coldstorage.thumbnailPreviewRequired` : is a thumbnail required to be used as a place holder to send a document to Cold Storage. Default value is `true`.\n\n### Frontend Contribution\n\n`nuxeo-coldstorage-web` module is also generating a _`.jar`_ file containing all the artifacts needed for an integration with Nuxeo's ecosystem.\nNevertheless this contribution is basically generating an ES Module ready for being integrated with Nuxeo Web UI.\n\nIt is possible to isolate this part of the build by running the following command:\n\n```shell script\nnpm run build\n```\n\nIt is using [rollup.js](https://rollupjs.org/guide/en/) to build, optimize and minify the code, making it ready for deployment.\n\n## Test\n\nIn a similar way to what was written above about the building process, it is possible to run tests against each one of the modules.\n\nHere, despite being under the same ecosystem, the contributions use different approaches.\n\n### Backend Contribution\n\n#### Unit Tests\n\n```shell script\nmvn test\n```\n\nA couple of unit test classes are designed to run with a blob provider using a real s3 bucket. In order to run them locally, you must define the following system properties:\n - `nuxeo.s3storage.awsid` : your AWS_ACCESS_KEY_ID\n - `nuxeo.s3storage.awssecret` : your AWS_SECRET_ACCESS_KEY\n - `nuxeo.test.s3storage.awstoken` : optional depending on your aws credentials type\n - `nuxeo.test.s3storage.region`: your AWS_REGION\n - `nuxeo.s3storage.bucket` : the name of the S3 bucket\n\n### Frontend Contribution\n\n#### Unit Tests\n\n```shell script\nnpm run test\n```\n\n[Web Test Runner](https://modern-web.dev/docs/test-runner/overview/) is the test runner used to run this contribution unit tests.\nThe tests run against bundled versions of Chromium, Firefox and Webkit, using [Playwright](https://www.npmjs.com/package/playwright)\n\n#### Functional Tests\n\n```shell script\nnpm run ftest\n```\n\nTo run the functional tests, [Nuxeo Web UI Functional Testing Framework](https://github.com/nuxeo/nuxeo-web-ui/tree/maintenance-3.0.x/packages/nuxeo-web-ui-ftest) is used.\nDue to its inner dependencies, it only works using NodeJS `lts/dubnium`, i.e., `v10`.\n\n## Development Workflow\n\n### Frontend\n\n*Disclaimer:* In order to contribute and develop Nuxeo Cold Storage UI, it is assumed that there is a Nuxeo server running with Nuxeo Cold Storage package installed and properly configured according the documentation above.\n\n#### Install Dependencies  \n\n```sh\nnpm install\n```\n\n#### Linting & Code Style\n\nThe UI contribution has linting to help making the code simpler and safer.\n\n```sh\nnpm run lint\n```\n\nTo help on code style and formatting the following command is available.\n\n```sh\nnpm run format\n```\n\nBoth `lint` and `format` commands run automatically before performing a commit in order to help us keeping the code base consistent with the rules defined.\n\n#### Integration with Web UI\n\nDespite being an \"independent\" project, this frontend contribution is build and aims to run as part of Nuxeo Web UI. So, most of the development will be done under that context.\nTo have the best experience possible, it is recommended to follow the `Web UI Development workflow` on [repository's README](https://github.com/nuxeo/nuxeo-web-ui/tree/maintenance-3.0.x).\n\nSince it already contemplates the possibility of integrating packages/addons, it is possible to serve it with `NUXEO_PACKAGES` environment variable pointing to the desired packages/addons.\n\n\n## CI/CD\n\nContinuous Integration & Continuous Deployment(and Delivery) are an important part of the development process.\n\nNuxeo Cold Storage integrates [Jenkins pipelines](https://jenkins.platform.dev.nuxeo.com/job/coldstorage/job/nuxeo-coldstorage/) for each maintenance branch, for _LTS_ (fast track) and also for each opened PR.\n\nThe following features are available:\n- Each PR merge to _10.10_/_lts-2021_/_lts-2023_ branches will generate a \"release candidate\" package\n\n### Localization Management\n\nNuxeo Cold Storage manages multilingual content with a [Crowdin](https://crowdin.com/) integration.\n\nThe [Crowdin](.github/workflows/crowdin.yml) GitHub Actions workflow handles automatic translations and related pull requests.\n\n# About Nuxeo\n\nThe [Nuxeo Platform](http://www.nuxeo.com/products/content-management-platform/) is an open source customizable and extensible content management platform for building business applications. It provides the foundation for developing [document management](http://www.nuxeo.com/solutions/document-management/), [digital asset management](http://www.nuxeo.com/solutions/digital-asset-management/), [case management application](http://www.nuxeo.com/solutions/case-management/) and [knowledge management](http://www.nuxeo.com/solutions/advanced-knowledge-base/). You can easily add features using ready-to-use addons or by extending the platform using its extension point system.\n\nThe Nuxeo Platform is developed and supported by Nuxeo, with contributions from the community.\n\nNuxeo dramatically improves how content-based applications are built, managed and deployed, making customers more agile, innovative and successful. Nuxeo provides a next generation, enterprise ready platform for building traditional and cutting-edge content oriented applications. Combining a powerful application development environment with\nSaaS-based tools and a modular architecture, the Nuxeo Platform and Products provide clear business value to some of the most recognizable brands including Verizon, Electronic Arts, Sharp, FICO, the U.S. Navy, and Boeing. Nuxeo is headquartered in New York and Paris.\nMore information is available at [www.nuxeo.com](http://www.nuxeo.com).\n",
            "digest": "39f7ca370031a727e5ab6de2f97880f9",
            "encoding": "UTF-8",
            "length": 8567,
            "mimeType": "text/plain",
            "name": "README.md"
          }
        ],
        "version": "2023.22"
      },
      "bundleId": "org.nuxeo.coldstorage",
      "components": [
        {
          "@type": "NXComponent",
          "documentationHtml": "",
          "extensionPoints": [],
          "extensions": [
            {
              "@type": "NXContribution",
              "documentationHtml": "",
              "extensionPoint": "org.nuxeo.ecm.platform.audit.service.NXAuditEventsService--event",
              "hierarchyPath": "/grp:org.nuxeo.coldstorage/org.nuxeo.coldstorage/org.nuxeo.coldstorage.audit/Contributions/org.nuxeo.coldstorage.audit--event",
              "id": "org.nuxeo.coldstorage.audit--event",
              "registrationOrder": 1,
              "targetComponentName": {
                "rawName": "service:org.nuxeo.ecm.platform.audit.service.NXAuditEventsService",
                "name": "org.nuxeo.ecm.platform.audit.service.NXAuditEventsService",
                "type": "service"
              },
              "version": "2023.3.6",
              "xml": "<extension point=\"event\" target=\"org.nuxeo.ecm.platform.audit.service.NXAuditEventsService\">\n    <event name=\"coldStorageContentMoved\"/>\n    <event name=\"coldStorageContentToRetrieve\"/>\n    <event name=\"coldStorageContentAvailable\"/>\n    <event name=\"coldStorageContentToRestore\"/>\n    <event name=\"coldStorageContentRestored\"/>\n    <event name=\"coldStorageDownload\"/>\n  </extension>"
            }
          ],
          "hierarchyPath": "/grp:org.nuxeo.coldstorage/org.nuxeo.coldstorage/org.nuxeo.coldstorage.audit",
          "name": "org.nuxeo.coldstorage.audit",
          "requirements": [],
          "resolutionOrder": 76,
          "services": [],
          "startOrder": 48,
          "version": "2023.3.6",
          "xmlFileContent": "<component name=\"org.nuxeo.coldstorage.audit\" version=\"1.0\">\n  <extension target=\"org.nuxeo.ecm.platform.audit.service.NXAuditEventsService\" point=\"event\">\n    <event name=\"coldStorageContentMoved\" />\n    <event name=\"coldStorageContentToRetrieve\" />\n    <event name=\"coldStorageContentAvailable\" />\n    <event name=\"coldStorageContentToRestore\" />\n    <event name=\"coldStorageContentRestored\" />\n    <event name=\"coldStorageDownload\" />\n  </extension>\n</component>\n",
          "xmlFileName": "/OSGI-INF/coldstorage-audit.xml",
          "xmlPureComponent": true
        },
        {
          "@type": "NXComponent",
          "documentationHtml": "",
          "extensionPoints": [],
          "extensions": [
            {
              "@type": "NXContribution",
              "documentationHtml": "",
              "extensionPoint": "org.nuxeo.ecm.core.operation.OperationServiceComponent--operations",
              "hierarchyPath": "/grp:org.nuxeo.coldstorage/org.nuxeo.coldstorage/org.nuxeo.coldstorage.operations.contrib/Contributions/org.nuxeo.coldstorage.operations.contrib--operations",
              "id": "org.nuxeo.coldstorage.operations.contrib--operations",
              "registrationOrder": 8,
              "targetComponentName": {
                "rawName": "service:org.nuxeo.ecm.core.operation.OperationServiceComponent",
                "name": "org.nuxeo.ecm.core.operation.OperationServiceComponent",
                "type": "service"
              },
              "version": "2023.3.6",
              "xml": "<extension point=\"operations\" target=\"org.nuxeo.ecm.core.operation.OperationServiceComponent\">\n    <operation class=\"org.nuxeo.coldstorage.operations.MoveToColdStorage\"/>\n    <operation class=\"org.nuxeo.coldstorage.operations.RequestRetrievalFromColdStorage\"/>\n    <operation class=\"org.nuxeo.coldstorage.operations.RestoreFromColdStorage\"/>\n  </extension>"
            }
          ],
          "hierarchyPath": "/grp:org.nuxeo.coldstorage/org.nuxeo.coldstorage/org.nuxeo.coldstorage.operations.contrib",
          "name": "org.nuxeo.coldstorage.operations.contrib",
          "requirements": [],
          "resolutionOrder": 77,
          "services": [],
          "startOrder": 52,
          "version": "2023.3.6",
          "xmlFileContent": "<?xml version=\"1.0\"?>\n<component name=\"org.nuxeo.coldstorage.operations.contrib\" version=\"1.0\">\n\n  <extension target=\"org.nuxeo.ecm.core.operation.OperationServiceComponent\" point=\"operations\">\n    <operation class=\"org.nuxeo.coldstorage.operations.MoveToColdStorage\" />\n    <operation class=\"org.nuxeo.coldstorage.operations.RequestRetrievalFromColdStorage\" />\n    <operation class=\"org.nuxeo.coldstorage.operations.RestoreFromColdStorage\" />\n  </extension>\n\n</component>\n",
          "xmlFileName": "/OSGI-INF/coldstorage-operations-contrib.xml",
          "xmlPureComponent": true
        },
        {
          "@type": "NXComponent",
          "documentationHtml": "",
          "extensionPoints": [],
          "extensions": [
            {
              "@type": "NXContribution",
              "documentationHtml": "",
              "extensionPoint": "org.nuxeo.ecm.core.scheduler.SchedulerService--schedule",
              "hierarchyPath": "/grp:org.nuxeo.coldstorage/org.nuxeo.coldstorage/org.nuxeo.coldstorage.events.contrib/Contributions/org.nuxeo.coldstorage.events.contrib--schedule",
              "id": "org.nuxeo.coldstorage.events.contrib--schedule",
              "registrationOrder": 0,
              "targetComponentName": {
                "rawName": "service:org.nuxeo.ecm.core.scheduler.SchedulerService",
                "name": "org.nuxeo.ecm.core.scheduler.SchedulerService",
                "type": "service"
              },
              "version": "2023.3.6",
              "xml": "<extension point=\"schedule\" target=\"org.nuxeo.ecm.core.scheduler.SchedulerService\">\n    <schedule id=\"checkAvailabilityOfBlobsBeingRetrieved\">\n      <cronExpression>${nuxeo.coldstorage.check.retrieve.state.cronExpression}</cronExpression>\n      <event>checkColdStorageContentAvailability</event>\n    </schedule>\n  </extension>"
            },
            {
              "@type": "NXContribution",
              "documentationHtml": "",
              "extensionPoint": "org.nuxeo.ecm.core.event.EventServiceComponent--listener",
              "hierarchyPath": "/grp:org.nuxeo.coldstorage/org.nuxeo.coldstorage/org.nuxeo.coldstorage.events.contrib/Contributions/org.nuxeo.coldstorage.events.contrib--listener",
              "id": "org.nuxeo.coldstorage.events.contrib--listener",
              "registrationOrder": 4,
              "targetComponentName": {
                "rawName": "service:org.nuxeo.ecm.core.event.EventServiceComponent",
                "name": "org.nuxeo.ecm.core.event.EventServiceComponent",
                "type": "service"
              },
              "version": "2023.3.6",
              "xml": "<extension point=\"listener\" target=\"org.nuxeo.ecm.core.event.EventServiceComponent\">\n    <listener async=\"true\" class=\"org.nuxeo.coldstorage.events.CheckColdStorageContentAvailabilityListener\" name=\"checkColdStorageContentAvailability\">\n      <event>checkColdStorageContentAvailability</event>\n    </listener>\n    <listener class=\"org.nuxeo.coldstorage.events.PreventColdStorageUpdateListener\" name=\"preventColdStorageUpdateListener\" priority=\"0\">\n      <event>beforeDocumentModification</event>\n    </listener>\n    <!-- StreamAuditEventListener has a priority of 500, less allows to be evaluated earlier -->\n    <listener class=\"org.nuxeo.coldstorage.events.DownloadColdDocumentListener\" name=\"downloadColdDocumentListener\" priority=\"400\">\n      <event>download</event>\n    </listener>\n    <!-- UpdateThumbnailListener has a priority of 999, more allows to be evaluated later -->\n    <listener class=\"org.nuxeo.coldstorage.events.CheckAlreadyInColdStorageListener\" name=\"checkAlreadyInColdStorageListener\" priority=\"900\">\n      <event>documentModified</event>\n      <event>documentCreated</event>\n    </listener>\n  </extension>"
            },
            {
              "@type": "NXContribution",
              "documentationHtml": "",
              "extensionPoint": "org.nuxeo.ecm.platform.ec.notification.service.NotificationService--notifications",
              "hierarchyPath": "/grp:org.nuxeo.coldstorage/org.nuxeo.coldstorage/org.nuxeo.coldstorage.events.contrib/Contributions/org.nuxeo.coldstorage.events.contrib--notifications",
              "id": "org.nuxeo.coldstorage.events.contrib--notifications",
              "registrationOrder": 0,
              "targetComponentName": {
                "rawName": "service:org.nuxeo.ecm.platform.ec.notification.service.NotificationService",
                "name": "org.nuxeo.ecm.platform.ec.notification.service.NotificationService",
                "type": "service"
              },
              "version": "2023.3.6",
              "xml": "<extension point=\"notifications\" target=\"org.nuxeo.ecm.platform.ec.notification.service.NotificationService\">\n    <notification availableIn=\"*\" channel=\"email\" label=\"label.document.download\" name=\"ColdStorageContentAvailable\" subject=\"Archive content available on '${docTitle}'\" template=\"coldStorageContentAvailable\">\n      <event name=\"coldStorageContentAvailable\"/>\n    </notification>\n    <notification availableIn=\"*\" channel=\"email\" label=\"label.document.download\" name=\"ColdStorageContentRestored\" subject=\"Main content '${docTitle}' restored\" template=\"coldStorageContentRestored\">\n      <event name=\"coldStorageContentRestored\"/>\n    </notification>\n  </extension>"
            },
            {
              "@type": "NXContribution",
              "documentationHtml": "",
              "extensionPoint": "org.nuxeo.ecm.platform.ec.notification.service.NotificationService--templates",
              "hierarchyPath": "/grp:org.nuxeo.coldstorage/org.nuxeo.coldstorage/org.nuxeo.coldstorage.events.contrib/Contributions/org.nuxeo.coldstorage.events.contrib--templates",
              "id": "org.nuxeo.coldstorage.events.contrib--templates",
              "registrationOrder": 0,
              "targetComponentName": {
                "rawName": "service:org.nuxeo.ecm.platform.ec.notification.service.NotificationService",
                "name": "org.nuxeo.ecm.platform.ec.notification.service.NotificationService",
                "type": "service"
              },
              "version": "2023.3.6",
              "xml": "<extension point=\"templates\" target=\"org.nuxeo.ecm.platform.ec.notification.service.NotificationService\">\n    <template name=\"coldStorageContentAvailable\" src=\"templates/coldStorageContentAvailable.ftl\"/>\n    <template name=\"coldStorageContentRestored\" src=\"templates/coldStorageContentRestored.ftl\"/>\n  </extension>"
            }
          ],
          "hierarchyPath": "/grp:org.nuxeo.coldstorage/org.nuxeo.coldstorage/org.nuxeo.coldstorage.events.contrib",
          "name": "org.nuxeo.coldstorage.events.contrib",
          "requirements": [],
          "resolutionOrder": 78,
          "services": [],
          "startOrder": 50,
          "version": "2023.3.6",
          "xmlFileContent": "<?xml version=\"1.0\"?>\n<component name=\"org.nuxeo.coldstorage.events.contrib\">\n\n  <extension target=\"org.nuxeo.ecm.core.scheduler.SchedulerService\" point=\"schedule\">\n    <schedule id=\"checkAvailabilityOfBlobsBeingRetrieved\">\n      <cronExpression>${nuxeo.coldstorage.check.retrieve.state.cronExpression}</cronExpression>\n      <event>checkColdStorageContentAvailability</event>\n    </schedule>\n  </extension>\n\n  <extension target=\"org.nuxeo.ecm.core.event.EventServiceComponent\" point=\"listener\">\n    <listener name=\"checkColdStorageContentAvailability\" async=\"true\"\n              class=\"org.nuxeo.coldstorage.events.CheckColdStorageContentAvailabilityListener\">\n      <event>checkColdStorageContentAvailability</event>\n    </listener>\n    <listener name=\"preventColdStorageUpdateListener\" priority=\"0\"\n              class=\"org.nuxeo.coldstorage.events.PreventColdStorageUpdateListener\">\n      <event>beforeDocumentModification</event>\n    </listener>\n    <!-- StreamAuditEventListener has a priority of 500, less allows to be evaluated earlier -->\n    <listener name=\"downloadColdDocumentListener\" priority=\"400\"\n              class=\"org.nuxeo.coldstorage.events.DownloadColdDocumentListener\">\n      <event>download</event>\n    </listener>\n    <!-- UpdateThumbnailListener has a priority of 999, more allows to be evaluated later -->\n    <listener name=\"checkAlreadyInColdStorageListener\" priority=\"900\"\n      class=\"org.nuxeo.coldstorage.events.CheckAlreadyInColdStorageListener\">\n      <event>documentModified</event>\n      <event>documentCreated</event>\n    </listener>\n  </extension>\n\n  <extension\n          target=\"org.nuxeo.ecm.platform.ec.notification.service.NotificationService\" point=\"notifications\">\n    <notification name=\"ColdStorageContentAvailable\" channel=\"email\" availableIn=\"*\"\n                  subject=\"Archive content available on '${docTitle}'\" template=\"coldStorageContentAvailable\"\n                  label=\"label.document.download\">\n      <event name=\"coldStorageContentAvailable\" />\n    </notification>\n    <notification name=\"ColdStorageContentRestored\" channel=\"email\" availableIn=\"*\"\n                  subject=\"Main content '${docTitle}' restored\" template=\"coldStorageContentRestored\"\n                  label=\"label.document.download\">\n      <event name=\"coldStorageContentRestored\" />\n    </notification>\n  </extension>\n\n  <extension target=\"org.nuxeo.ecm.platform.ec.notification.service.NotificationService\" point=\"templates\">\n    <template name=\"coldStorageContentAvailable\" src=\"templates/coldStorageContentAvailable.ftl\" />\n    <template name=\"coldStorageContentRestored\" src=\"templates/coldStorageContentRestored.ftl\" />\n  </extension>\n\n</component>\n",
          "xmlFileName": "/OSGI-INF/coldstorage-events-contrib.xml",
          "xmlPureComponent": true
        },
        {
          "@type": "NXComponent",
          "documentationHtml": "",
          "extensionPoints": [],
          "extensions": [
            {
              "@type": "NXContribution",
              "documentationHtml": "",
              "extensionPoint": "org.nuxeo.ecm.core.io.MarshallerRegistry--marshallers",
              "hierarchyPath": "/grp:org.nuxeo.coldstorage/org.nuxeo.coldstorage/org.nuxeo.coldstorage.jsonEnrichers/Contributions/org.nuxeo.coldstorage.jsonEnrichers--marshallers",
              "id": "org.nuxeo.coldstorage.jsonEnrichers--marshallers",
              "registrationOrder": 2,
              "targetComponentName": {
                "rawName": "service:org.nuxeo.ecm.core.io.MarshallerRegistry",
                "name": "org.nuxeo.ecm.core.io.MarshallerRegistry",
                "type": "service"
              },
              "version": "2023.3.6",
              "xml": "<extension point=\"marshallers\" target=\"org.nuxeo.ecm.core.io.MarshallerRegistry\">\n    <register class=\"org.nuxeo.coldstorage.io.IsSharedMainContentJsonEnricher\" enable=\"true\"/>\n  </extension>"
            }
          ],
          "hierarchyPath": "/grp:org.nuxeo.coldstorage/org.nuxeo.coldstorage/org.nuxeo.coldstorage.jsonEnrichers",
          "name": "org.nuxeo.coldstorage.jsonEnrichers",
          "requirements": [],
          "resolutionOrder": 79,
          "services": [],
          "startOrder": 51,
          "version": "2023.3.6",
          "xmlFileContent": "<?xml version=\"1.0\"?>\n<component name=\"org.nuxeo.coldstorage.jsonEnrichers\">\n  <extension target=\"org.nuxeo.ecm.core.io.MarshallerRegistry\" point=\"marshallers\">\n    <register class=\"org.nuxeo.coldstorage.io.IsSharedMainContentJsonEnricher\"\n      enable=\"true\" />\n  </extension>\n</component>\n",
          "xmlFileName": "/OSGI-INF/coldstorage-enrichers-contrib.xml",
          "xmlPureComponent": true
        },
        {
          "@type": "NXComponent",
          "documentationHtml": "",
          "extensionPoints": [],
          "extensions": [
            {
              "@type": "NXContribution",
              "documentationHtml": "",
              "extensionPoint": "org.nuxeo.ecm.core.bulk--actions",
              "hierarchyPath": "/grp:org.nuxeo.coldstorage/org.nuxeo.coldstorage/org.nuxeo.coldstorage.bulk.contrib/Contributions/org.nuxeo.coldstorage.bulk.contrib--actions",
              "id": "org.nuxeo.coldstorage.bulk.contrib--actions",
              "registrationOrder": 0,
              "targetComponentName": {
                "rawName": "service:org.nuxeo.ecm.core.bulk",
                "name": "org.nuxeo.ecm.core.bulk",
                "type": "service"
              },
              "version": "2023.3.6",
              "xml": "<extension point=\"actions\" target=\"org.nuxeo.ecm.core.bulk\">\n    <action batchSize=\"20\" bucketSize=\"100\" httpEnabled=\"true\" inputStream=\"bulk/moveToColdStorage\" name=\"moveToColdStorage\"/>\n    <action batchSize=\"20\" bucketSize=\"100\" httpEnabled=\"false\" inputStream=\"bulk/propagateMoveToColdStorage\" name=\"propagateMoveToColdStorage\"/>\n    <action batchSize=\"20\" bucketSize=\"100\" httpEnabled=\"false\" inputStream=\"bulk/propagateRestoreFromColdStorage\" name=\"propagateRestoreFromColdStorage\"/>\n    <action batchSize=\"20\" bucketSize=\"100\" httpEnabled=\"false\" inputStream=\"bulk/checkColdStorageAvailability\" name=\"checkColdStorageAvailability\"/>\n  </extension>"
            },
            {
              "@type": "NXContribution",
              "documentationHtml": "",
              "extensionPoint": "org.nuxeo.runtime.stream.service--streamProcessor",
              "hierarchyPath": "/grp:org.nuxeo.coldstorage/org.nuxeo.coldstorage/org.nuxeo.coldstorage.bulk.contrib/Contributions/org.nuxeo.coldstorage.bulk.contrib--streamProcessor",
              "id": "org.nuxeo.coldstorage.bulk.contrib--streamProcessor",
              "registrationOrder": 1,
              "targetComponentName": {
                "rawName": "service:org.nuxeo.runtime.stream.service",
                "name": "org.nuxeo.runtime.stream.service",
                "type": "service"
              },
              "version": "2023.3.6",
              "xml": "<extension point=\"streamProcessor\" target=\"org.nuxeo.runtime.stream.service\">\n    <streamProcessor class=\"org.nuxeo.coldstorage.action.MoveToColdStorageContentAction\" defaultConcurrency=\"2\" defaultPartitions=\"4\" name=\"moveToColdStorage\">\n      <policy continueOnFailure=\"true\" delay=\"1s\" maxDelay=\"10s\" maxRetries=\"3\" name=\"default\"/>\n    </streamProcessor>\n    <streamProcessor class=\"org.nuxeo.coldstorage.action.PropagateMoveToColdStorageContentAction\" defaultConcurrency=\"2\" defaultPartitions=\"4\" name=\"propagateMoveToColdStorage\">\n      <policy continueOnFailure=\"true\" delay=\"1s\" maxDelay=\"10s\" maxRetries=\"3\" name=\"default\"/>\n    </streamProcessor>\n    <streamProcessor class=\"org.nuxeo.coldstorage.action.PropagateRestoreFromColdStorageContentAction\" defaultConcurrency=\"2\" defaultPartitions=\"4\" name=\"propagateRestoreFromColdStorage\">\n      <policy continueOnFailure=\"true\" delay=\"1s\" maxDelay=\"10s\" maxRetries=\"3\" name=\"default\"/>\n    </streamProcessor>\n    <streamProcessor class=\"org.nuxeo.coldstorage.action.CheckColdStorageAvailabilityAction\" defaultConcurrency=\"2\" defaultPartitions=\"4\" defaultScroller=\"default\" name=\"checkColdStorageAvailability\">\n      <policy continueOnFailure=\"true\" delay=\"1s\" maxDelay=\"10s\" maxRetries=\"3\" name=\"default\"/>\n    </streamProcessor>\n  </extension>"
            }
          ],
          "hierarchyPath": "/grp:org.nuxeo.coldstorage/org.nuxeo.coldstorage/org.nuxeo.coldstorage.bulk.contrib",
          "name": "org.nuxeo.coldstorage.bulk.contrib",
          "requirements": [],
          "resolutionOrder": 80,
          "services": [],
          "startOrder": 49,
          "version": "2023.3.6",
          "xmlFileContent": "<?xml version=\"1.0\"?>\n<component name=\"org.nuxeo.coldstorage.bulk.contrib\">\n\n  <extension target=\"org.nuxeo.ecm.core.bulk\" point=\"actions\">\n    <action name=\"moveToColdStorage\" inputStream=\"bulk/moveToColdStorage\"\n      bucketSize=\"100\" batchSize=\"20\" httpEnabled=\"true\" />\n    <action name=\"propagateMoveToColdStorage\" inputStream=\"bulk/propagateMoveToColdStorage\"\n      bucketSize=\"100\" batchSize=\"20\" httpEnabled=\"false\" />\n    <action name=\"propagateRestoreFromColdStorage\" inputStream=\"bulk/propagateRestoreFromColdStorage\"\n      bucketSize=\"100\" batchSize=\"20\" httpEnabled=\"false\" />\n    <action name=\"checkColdStorageAvailability\" inputStream=\"bulk/checkColdStorageAvailability\"\n      bucketSize=\"100\" batchSize=\"20\" httpEnabled=\"false\" />\n  </extension>\n\n  <extension target=\"org.nuxeo.runtime.stream.service\" point=\"streamProcessor\">\n    <streamProcessor name=\"moveToColdStorage\"\n      class=\"org.nuxeo.coldstorage.action.MoveToColdStorageContentAction\"\n      defaultConcurrency=\"${nuxeo.bulk.action.moveToColdStorage.defaultConcurrency:=2}\"\n      defaultPartitions=\"${nuxeo.bulk.action.moveToColdStorage.defaultPartitions:=4}\">\n      <policy name=\"default\" maxRetries=\"3\" delay=\"1s\" maxDelay=\"10s\" continueOnFailure=\"true\" />\n    </streamProcessor>\n    <streamProcessor name=\"propagateMoveToColdStorage\"\n      class=\"org.nuxeo.coldstorage.action.PropagateMoveToColdStorageContentAction\"\n      defaultConcurrency=\"${nuxeo.bulk.action.propagateMoveToColdStorage.defaultConcurrency:=2}\"\n      defaultPartitions=\"${nuxeo.bulk.action.propagateMoveToColdStorage.defaultPartitions:=4}\">\n      <policy name=\"default\" maxRetries=\"3\" delay=\"1s\" maxDelay=\"10s\" continueOnFailure=\"true\" />\n    </streamProcessor>\n    <streamProcessor name=\"propagateRestoreFromColdStorage\"\n      class=\"org.nuxeo.coldstorage.action.PropagateRestoreFromColdStorageContentAction\"\n      defaultConcurrency=\"${nuxeo.bulk.action.propagateRestoreFromColdStorage.defaultConcurrency:=2}\"\n      defaultPartitions=\"${nuxeo.bulk.action.propagateRestoreFromColdStorage.defaultPartitions:=4}\">\n      <policy name=\"default\" maxRetries=\"3\" delay=\"1s\" maxDelay=\"10s\" continueOnFailure=\"true\" />\n    </streamProcessor>\n    <streamProcessor name=\"checkColdStorageAvailability\"\n      class=\"org.nuxeo.coldstorage.action.CheckColdStorageAvailabilityAction\"\n      defaultScroller=\"${nuxeo.bulk.action.checkColdStorageAvailability.scroller:=default}\"\n      defaultConcurrency=\"${nuxeo.bulk.action.checkColdStorageAvailability.defaultConcurrency:=2}\"\n      defaultPartitions=\"${nuxeo.bulk.action.checkColdStorageAvailability.defaultPartitions:=4}\">\n      <policy name=\"default\" maxRetries=\"3\" delay=\"1s\" maxDelay=\"10s\" continueOnFailure=\"true\" />\n    </streamProcessor>\n  </extension>\n\n</component>\n",
          "xmlFileName": "/OSGI-INF/coldstorage-bulk-contrib.xml",
          "xmlPureComponent": true
        },
        {
          "@type": "NXComponent",
          "documentationHtml": "",
          "extensionPoints": [],
          "extensions": [
            {
              "@type": "NXContribution",
              "documentationHtml": "",
              "extensionPoint": "org.nuxeo.coldstorage.service.ColdStorageService--coldStorageRendition",
              "hierarchyPath": "/grp:org.nuxeo.coldstorage/org.nuxeo.coldstorage/org.nuxeo.coldstorage.rendition.contrib/Contributions/org.nuxeo.coldstorage.rendition.contrib--coldStorageRendition",
              "id": "org.nuxeo.coldstorage.rendition.contrib--coldStorageRendition",
              "registrationOrder": 0,
              "targetComponentName": {
                "rawName": "service:org.nuxeo.coldstorage.service.ColdStorageService",
                "name": "org.nuxeo.coldstorage.service.ColdStorageService",
                "type": "service"
              },
              "version": "2023.3.6",
              "xml": "<extension point=\"coldStorageRendition\" target=\"org.nuxeo.coldstorage.service.ColdStorageService\">\n    <coldStorageRendition name=\"defaultRendition\" renditionName=\"thumbnail\"/>\n    <coldStorageRendition docType=\"Picture\" facet=\"Picture\" name=\"pictureRendition\" renditionName=\"Small\"/>\n    <coldStorageRendition docType=\"Video\" facet=\"Video\" name=\"videoRendition\" renditionName=\"MP4 480p\"/>\n  </extension>"
            }
          ],
          "hierarchyPath": "/grp:org.nuxeo.coldstorage/org.nuxeo.coldstorage/org.nuxeo.coldstorage.rendition.contrib",
          "name": "org.nuxeo.coldstorage.rendition.contrib",
          "requirements": [],
          "resolutionOrder": 81,
          "services": [],
          "startOrder": 53,
          "version": "2023.3.6",
          "xmlFileContent": "<?xml version=\"1.0\"?>\n<component name=\"org.nuxeo.coldstorage.rendition.contrib\">\n\n  <extension target=\"org.nuxeo.coldstorage.service.ColdStorageService\"  point=\"coldStorageRendition\" >\n    <coldStorageRendition name=\"defaultRendition\" renditionName=\"thumbnail\" />\n    <coldStorageRendition name=\"pictureRendition\" docType=\"Picture\" facet=\"Picture\" renditionName=\"Small\" />\n    <coldStorageRendition name=\"videoRendition\" docType=\"Video\" facet=\"Video\" renditionName=\"MP4 480p\" />\n  </extension>\n\n</component>\n",
          "xmlFileName": "/OSGI-INF/coldstorage-rendition-contrib.xml",
          "xmlPureComponent": true
        },
        {
          "@type": "NXComponent",
          "documentationHtml": "",
          "extensionPoints": [],
          "extensions": [
            {
              "@type": "NXContribution",
              "documentationHtml": "",
              "extensionPoint": "org.nuxeo.ecm.core.schema.TypeService--schema",
              "hierarchyPath": "/grp:org.nuxeo.coldstorage/org.nuxeo.coldstorage/org.nuxeo.coldstorage.types/Contributions/org.nuxeo.coldstorage.types--schema",
              "id": "org.nuxeo.coldstorage.types--schema",
              "registrationOrder": 3,
              "targetComponentName": {
                "rawName": "service:org.nuxeo.ecm.core.schema.TypeService",
                "name": "org.nuxeo.ecm.core.schema.TypeService",
                "type": "service"
              },
              "version": "2023.3.6",
              "xml": "<extension point=\"schema\" target=\"org.nuxeo.ecm.core.schema.TypeService\">\n    <schema name=\"coldstorage\" prefix=\"coldstorage\" src=\"schemas/coldstorage.xsd\"/>\n\n    <property indexOrder=\"ascending\" name=\"content/digest\" schema=\"file\"/>\n    <property indexOrder=\"ascending\" name=\"beingRetrieved\" schema=\"coldstorage\"/>\n    <property indexOrder=\"ascending\" name=\"coldContent/digest\" schema=\"coldstorage\"/>\n  </extension>"
            },
            {
              "@type": "NXContribution",
              "documentationHtml": "",
              "extensionPoint": "org.nuxeo.ecm.core.schema.TypeService--doctype",
              "hierarchyPath": "/grp:org.nuxeo.coldstorage/org.nuxeo.coldstorage/org.nuxeo.coldstorage.types/Contributions/org.nuxeo.coldstorage.types--doctype",
              "id": "org.nuxeo.coldstorage.types--doctype",
              "registrationOrder": 3,
              "targetComponentName": {
                "rawName": "service:org.nuxeo.ecm.core.schema.TypeService",
                "name": "org.nuxeo.ecm.core.schema.TypeService",
                "type": "service"
              },
              "version": "2023.3.6",
              "xml": "<extension point=\"doctype\" target=\"org.nuxeo.ecm.core.schema.TypeService\">\n    <facet name=\"ColdStorage\">\n      <schema name=\"coldstorage\"/>\n    </facet>\n  </extension>"
            }
          ],
          "hierarchyPath": "/grp:org.nuxeo.coldstorage/org.nuxeo.coldstorage/org.nuxeo.coldstorage.types",
          "name": "org.nuxeo.coldstorage.types",
          "requirements": [
            "org.nuxeo.ecm.core.CoreExtensions"
          ],
          "resolutionOrder": 88,
          "services": [],
          "startOrder": 55,
          "version": "2023.3.6",
          "xmlFileContent": "<?xml version=\"1.0\"?>\n<component name=\"org.nuxeo.coldstorage.types\">\n\n  <require>org.nuxeo.ecm.core.CoreExtensions</require>\n\n  <extension target=\"org.nuxeo.ecm.core.schema.TypeService\" point=\"schema\">\n    <schema name=\"coldstorage\" prefix=\"coldstorage\" src=\"schemas/coldstorage.xsd\" />\n\n    <property schema=\"file\" name=\"content/digest\" indexOrder=\"ascending\" />\n    <property schema=\"coldstorage\" name=\"beingRetrieved\" indexOrder=\"ascending\" />\n    <property schema=\"coldstorage\" name=\"coldContent/digest\" indexOrder=\"ascending\" />\n  </extension>\n\n  <extension target=\"org.nuxeo.ecm.core.schema.TypeService\"\n             point=\"doctype\">\n    <facet name=\"ColdStorage\">\n      <schema name=\"coldstorage\" />\n    </facet>\n  </extension>\n\n</component>\n",
          "xmlFileName": "/OSGI-INF/coldstorage-core-types-contrib.xml",
          "xmlPureComponent": true
        },
        {
          "@type": "NXComponent",
          "documentationHtml": "",
          "extensionPoints": [],
          "extensions": [
            {
              "@type": "NXContribution",
              "documentationHtml": "",
              "extensionPoint": "org.nuxeo.ecm.core.security.SecurityService--permissions",
              "hierarchyPath": "/grp:org.nuxeo.coldstorage/org.nuxeo.coldstorage/org.nuxeo.coldstorage.security/Contributions/org.nuxeo.coldstorage.security--permissions",
              "id": "org.nuxeo.coldstorage.security--permissions",
              "registrationOrder": 1,
              "targetComponentName": {
                "rawName": "service:org.nuxeo.ecm.core.security.SecurityService",
                "name": "org.nuxeo.ecm.core.security.SecurityService",
                "type": "service"
              },
              "version": "2023.3.6",
              "xml": "<extension point=\"permissions\" target=\"org.nuxeo.ecm.core.security.SecurityService\">\n        <permission name=\"WriteColdStorage\">\n            <include>ReadWrite</include>\n            <include>WriteColdStorage</include>\n        </permission>\n    </extension>"
            },
            {
              "@type": "NXContribution",
              "documentationHtml": "",
              "extensionPoint": "org.nuxeo.ecm.core.security.SecurityService--permissionsVisibility",
              "hierarchyPath": "/grp:org.nuxeo.coldstorage/org.nuxeo.coldstorage/org.nuxeo.coldstorage.security/Contributions/org.nuxeo.coldstorage.security--permissionsVisibility",
              "id": "org.nuxeo.coldstorage.security--permissionsVisibility",
              "registrationOrder": 1,
              "targetComponentName": {
                "rawName": "service:org.nuxeo.ecm.core.security.SecurityService",
                "name": "org.nuxeo.ecm.core.security.SecurityService",
                "type": "service"
              },
              "version": "2023.3.6",
              "xml": "<extension point=\"permissionsVisibility\" target=\"org.nuxeo.ecm.core.security.SecurityService\">\n\n        <visibility>\n            <item order=\"80\" show=\"true\">WriteColdStorage</item>\n        </visibility>\n\n    </extension>"
            }
          ],
          "hierarchyPath": "/grp:org.nuxeo.coldstorage/org.nuxeo.coldstorage/org.nuxeo.coldstorage.security",
          "name": "org.nuxeo.coldstorage.security",
          "requirements": [
            "org.nuxeo.ecm.core.security.defaultPermissions"
          ],
          "resolutionOrder": 94,
          "services": [],
          "startOrder": 54,
          "version": "2023.3.6",
          "xmlFileContent": "<?xml version=\"1.0\"?>\n<component name=\"org.nuxeo.coldstorage.security\">\n    <require>org.nuxeo.ecm.core.security.defaultPermissions</require>\n    <extension target=\"org.nuxeo.ecm.core.security.SecurityService\"\n               point=\"permissions\">\n        <permission name=\"WriteColdStorage\">\n            <include>ReadWrite</include>\n            <include>WriteColdStorage</include>\n        </permission>\n    </extension>\n\n    <extension target=\"org.nuxeo.ecm.core.security.SecurityService\"\n               point=\"permissionsVisibility\">\n\n        <visibility>\n            <item show=\"true\" order=\"80\">WriteColdStorage</item>\n        </visibility>\n\n    </extension>\n</component>\n",
          "xmlFileName": "/OSGI-INF/coldstorage-security.xml",
          "xmlPureComponent": true
        },
        {
          "@type": "NXComponent",
          "componentClass": "org.nuxeo.coldstorage.service.ColdStorageServiceImpl",
          "documentationHtml": "",
          "extensionPoints": [
            {
              "@type": "NXExtensionPoint",
              "componentId": "org.nuxeo.coldstorage.service.ColdStorageService",
              "descriptors": [
                "org.nuxeo.coldstorage.ColdStorageRenditionDescriptor"
              ],
              "documentation": "\n            @author Abdoul BA (aba@nuxeo.com)\n            This extension provides renditions according to the type, facet and default one.\n            <code>\n    <coldStorageRendition name=\"defaultRendition\" renditionName=\"Thumbnail\"/>\n    <coldStorageRendition docType=\"Picture\" facet=\"Picture\"\n        name=\"pictureRendition\" renditionName=\"Small\"/>\n</code>\n",
              "documentationHtml": "<p>\nThis extension provides renditions according to the type, facet and default one.\n</p><p></p><pre><code>    &lt;coldStorageRendition name&#61;&#34;defaultRendition&#34; renditionName&#61;&#34;Thumbnail&#34;/&gt;\n    &lt;coldStorageRendition docType&#61;&#34;Picture&#34; facet&#61;&#34;Picture&#34;\n        name&#61;&#34;pictureRendition&#34; renditionName&#61;&#34;Small&#34;/&gt;\n</code></pre><p></p>",
              "hierarchyPath": "/grp:org.nuxeo.coldstorage/org.nuxeo.coldstorage/org.nuxeo.coldstorage.service.ColdStorageService/ExtensionPoints/org.nuxeo.coldstorage.service.ColdStorageService--coldStorageRendition",
              "id": "org.nuxeo.coldstorage.service.ColdStorageService--coldStorageRendition",
              "label": "coldStorageRendition (org.nuxeo.coldstorage.service.ColdStorageService)",
              "name": "coldStorageRendition",
              "version": "2023.3.6"
            }
          ],
          "extensions": [],
          "hierarchyPath": "/grp:org.nuxeo.coldstorage/org.nuxeo.coldstorage/org.nuxeo.coldstorage.service.ColdStorageService",
          "name": "org.nuxeo.coldstorage.service.ColdStorageService",
          "requirements": [
            "org.nuxeo.ecm.platform.rendition.service.RenditionService"
          ],
          "resolutionOrder": 477,
          "services": [
            {
              "@type": "NXService",
              "componentId": "org.nuxeo.coldstorage.service.ColdStorageService",
              "hierarchyPath": "/grp:org.nuxeo.coldstorage/org.nuxeo.coldstorage/org.nuxeo.coldstorage.service.ColdStorageService/Services/org.nuxeo.coldstorage.service.ColdStorageService",
              "id": "org.nuxeo.coldstorage.service.ColdStorageService",
              "overriden": false,
              "version": "2023.3.6"
            }
          ],
          "startOrder": 781,
          "version": "2023.3.6",
          "xmlFileContent": "<?xml version=\"1.0\"?>\n<component name=\"org.nuxeo.coldstorage.service.ColdStorageService\">\n\n    <require>org.nuxeo.ecm.platform.rendition.service.RenditionService</require>\n\n    <implementation class=\"org.nuxeo.coldstorage.service.ColdStorageServiceImpl\" />\n\n    <service>\n        <provide interface=\"org.nuxeo.coldstorage.service.ColdStorageService\" />\n    </service>\n\n    <extension-point name=\"coldStorageRendition\">\n        <documentation>\n            @author Abdoul BA (aba@nuxeo.com)\n            This extension provides renditions according to the type, facet and default one.\n            <code>\n                <coldStorageRendition name=\"defaultRendition\" renditionName=\"Thumbnail\" />\n                <coldStorageRendition name=\"pictureRendition\" docType=\"Picture\" facet=\"Picture\" renditionName=\"Small\" />\n            </code>\n        </documentation>\n        <object class=\"org.nuxeo.coldstorage.ColdStorageRenditionDescriptor\" />\n    </extension-point>\n\n</component>\n",
          "xmlFileName": "/OSGI-INF/coldstorage-service.xml",
          "xmlPureComponent": false
        }
      ],
      "fileName": "nuxeo-coldstorage-2023.3.6.jar",
      "groupId": "org.nuxeo.coldstorage",
      "hierarchyPath": "/grp:org.nuxeo.coldstorage/org.nuxeo.coldstorage",
      "id": "org.nuxeo.coldstorage",
      "location": "",
      "manifest": "Manifest-Version: 1.0\r\nArchiver-Version: Plexus Archiver\r\nCreated-By: Apache Maven 3.9.6\r\nBuilt-By: root\r\nBuild-Jdk: 17.0.10\r\nBundle-ManifestVersion: 2\r\nBundle-Version: 2023.3.6-t20240409-082123\r\nBundle-Name: Nuxeo Cold Storage\r\nBundle-SymbolicName: org.nuxeo.coldstorage;singleton:=true\r\nBundle-Vendor: Nuxeo\r\nBundle-Localization: bundle\r\nEclipse-LazyStart: true\r\nNuxeo-Component: OSGI-INF/coldstorage-core-types-contrib.xml,OSGI-INF/co\r\n ldstorage-audit.xml,OSGI-INF/coldstorage-operations-contrib.xml,OSGI-IN\r\n F/coldstorage-events-contrib.xml,OSGI-INF/coldstorage-enrichers-contrib\r\n .xml,OSGI-INF/coldstorage-security.xml,OSGI-INF/coldstorage-bulk-contri\r\n b.xml,OSGI-INF/coldstorage-service.xml,OSGI-INF/coldstorage-rendition-c\r\n ontrib.xml\r\n\r\n",
      "maxResolutionOrder": 477,
      "minResolutionOrder": 76,
      "packages": [
        "nuxeo-coldstorage"
      ],
      "parentReadme": {
        "blobProviderId": "default",
        "content": "[![Build Status](https://jenkins.platform.dev.nuxeo.com/buildStatus/icon?job=coldstorage%2Fnuxeo-coldstorage%2Flts-2023)](https://jenkins.platform.dev.nuxeo.com/job/coldstorage/job/nuxeo-coldstorage/job/lts-2023/)\n\n# Nuxeo Cold Storage\n\nThe Nuxeo Cold Storage addon allows the storage of the document main content in a cold storage. This can be needed for archiving, compliance, etc.\n\nFor more details around functionalities, requirements, installation and usage please consider this addon [official documentation](https://doc.nuxeo.com/nxdoc/nuxeo-coldstorage/).\n\n## Context\nNuxeo Cold Storage is an addon that can be plugged to Nuxeo.\n\nIt is bundled as a marketplace package that includes all the backend and frontend contributions needed for [Nuxeo Platform](https://github.com/nuxeo/nuxeo) and [Nuxeo Web UI](https://github.com/nuxeo/nuxeo-web-ui).\n\n## Sub Modules Organization\n\n- **ci**: CI/CD files and configurations responsible to generate preview environments and running Cold Storage pipeline\n- **nuxeo-coldstorage**: Backend contribution for Nuxeo Platform\n- **nuxeo-coldstorage-package**: Builder for [nuxeo-coldstorage](https://connect.nuxeo.com/nuxeo/site/marketplace/package/nuxeo-coldstorage) marketplace package. This package will install all the necessary mechanisms to integrate Cold Storage capabilities into Nuxeo\n- **nuxeo-coldstorage-web**: Frontend contribution for Nuxeo Web UI\n\n## Build\n\nNuxeo's ecosystem is Java based and uses Maven. This addon is not an exception and can be built by simply performing:\n\n```shell script\nmvn clean install\n```\n\nThis will build all the modules except _ci_ and generate the correspondent artifacts: _`.jar`_ files for the contributions, and a _`.zip_ file for the package.\n\n## DB configuration\n\nCreate the following db indexes for an optimal functioning of the addon:\n - `coldstorage:beingRetrieved`\n - `coldstorage:coldContent/digest`\n - `file:content/digest`\n - `ecm:mixinTypes`\n\n Typically on MongoDB:\n ```\n db.default.createIndex(\n    { \"coldstorage:beingRetrieved\": 1 },\n    { partialFilterExpression: { \"coldstorage:beingRetrieved\": true } }\n );\n\n db.default.createIndex(\n    { \"content.digest\": 1 }\n );\n\n db.default.createIndex(\n    { \"coldstorage:coldContent.digest\": 1 }\n );\n\n db.default.createIndex(\n   { \"ecm:mixinTypes\": 1 }\n);\n ```\n\n## Configuration properties\n\n - `nuxeo.coldstorage.check.retrieve.state.cronExpression` :  cron expression to define the frequency of the execution of the process to check if a document has been retrieved. Default value is `0 7 * ? * * *` i.e. every hour at the 7th minute.\n - `nuxeo.bulk.action.checkColdStorageAvailability.scroller` : scroller implementation to be used to query documents being retrieved. `elastic` value can be set to relieve the regular back-end.\n - `nuxeo.coldstorage.numberOfDaysOfAvailability.value.default` : number of days a document remains available once it has been retrieved. Default value is `1`.\n - `nuxeo.coldstorage.thumbnailPreviewRequired` : is a thumbnail required to be used as a place holder to send a document to Cold Storage. Default value is `true`.\n\n### Frontend Contribution\n\n`nuxeo-coldstorage-web` module is also generating a _`.jar`_ file containing all the artifacts needed for an integration with Nuxeo's ecosystem.\nNevertheless this contribution is basically generating an ES Module ready for being integrated with Nuxeo Web UI.\n\nIt is possible to isolate this part of the build by running the following command:\n\n```shell script\nnpm run build\n```\n\nIt is using [rollup.js](https://rollupjs.org/guide/en/) to build, optimize and minify the code, making it ready for deployment.\n\n## Test\n\nIn a similar way to what was written above about the building process, it is possible to run tests against each one of the modules.\n\nHere, despite being under the same ecosystem, the contributions use different approaches.\n\n### Backend Contribution\n\n#### Unit Tests\n\n```shell script\nmvn test\n```\n\nA couple of unit test classes are designed to run with a blob provider using a real s3 bucket. In order to run them locally, you must define the following system properties:\n - `nuxeo.s3storage.awsid` : your AWS_ACCESS_KEY_ID\n - `nuxeo.s3storage.awssecret` : your AWS_SECRET_ACCESS_KEY\n - `nuxeo.test.s3storage.awstoken` : optional depending on your aws credentials type\n - `nuxeo.test.s3storage.region`: your AWS_REGION\n - `nuxeo.s3storage.bucket` : the name of the S3 bucket\n\n### Frontend Contribution\n\n#### Unit Tests\n\n```shell script\nnpm run test\n```\n\n[Web Test Runner](https://modern-web.dev/docs/test-runner/overview/) is the test runner used to run this contribution unit tests.\nThe tests run against bundled versions of Chromium, Firefox and Webkit, using [Playwright](https://www.npmjs.com/package/playwright)\n\n#### Functional Tests\n\n```shell script\nnpm run ftest\n```\n\nTo run the functional tests, [Nuxeo Web UI Functional Testing Framework](https://github.com/nuxeo/nuxeo-web-ui/tree/maintenance-3.0.x/packages/nuxeo-web-ui-ftest) is used.\nDue to its inner dependencies, it only works using NodeJS `lts/dubnium`, i.e., `v10`.\n\n## Development Workflow\n\n### Frontend\n\n*Disclaimer:* In order to contribute and develop Nuxeo Cold Storage UI, it is assumed that there is a Nuxeo server running with Nuxeo Cold Storage package installed and properly configured according the documentation above.\n\n#### Install Dependencies  \n\n```sh\nnpm install\n```\n\n#### Linting & Code Style\n\nThe UI contribution has linting to help making the code simpler and safer.\n\n```sh\nnpm run lint\n```\n\nTo help on code style and formatting the following command is available.\n\n```sh\nnpm run format\n```\n\nBoth `lint` and `format` commands run automatically before performing a commit in order to help us keeping the code base consistent with the rules defined.\n\n#### Integration with Web UI\n\nDespite being an \"independent\" project, this frontend contribution is build and aims to run as part of Nuxeo Web UI. So, most of the development will be done under that context.\nTo have the best experience possible, it is recommended to follow the `Web UI Development workflow` on [repository's README](https://github.com/nuxeo/nuxeo-web-ui/tree/maintenance-3.0.x).\n\nSince it already contemplates the possibility of integrating packages/addons, it is possible to serve it with `NUXEO_PACKAGES` environment variable pointing to the desired packages/addons.\n\n\n## CI/CD\n\nContinuous Integration & Continuous Deployment(and Delivery) are an important part of the development process.\n\nNuxeo Cold Storage integrates [Jenkins pipelines](https://jenkins.platform.dev.nuxeo.com/job/coldstorage/job/nuxeo-coldstorage/) for each maintenance branch, for _LTS_ (fast track) and also for each opened PR.\n\nThe following features are available:\n- Each PR merge to _10.10_/_lts-2021_/_lts-2023_ branches will generate a \"release candidate\" package\n\n### Localization Management\n\nNuxeo Cold Storage manages multilingual content with a [Crowdin](https://crowdin.com/) integration.\n\nThe [Crowdin](.github/workflows/crowdin.yml) GitHub Actions workflow handles automatic translations and related pull requests.\n\n# About Nuxeo\n\nThe [Nuxeo Platform](http://www.nuxeo.com/products/content-management-platform/) is an open source customizable and extensible content management platform for building business applications. It provides the foundation for developing [document management](http://www.nuxeo.com/solutions/document-management/), [digital asset management](http://www.nuxeo.com/solutions/digital-asset-management/), [case management application](http://www.nuxeo.com/solutions/case-management/) and [knowledge management](http://www.nuxeo.com/solutions/advanced-knowledge-base/). You can easily add features using ready-to-use addons or by extending the platform using its extension point system.\n\nThe Nuxeo Platform is developed and supported by Nuxeo, with contributions from the community.\n\nNuxeo dramatically improves how content-based applications are built, managed and deployed, making customers more agile, innovative and successful. Nuxeo provides a next generation, enterprise ready platform for building traditional and cutting-edge content oriented applications. Combining a powerful application development environment with\nSaaS-based tools and a modular architecture, the Nuxeo Platform and Products provide clear business value to some of the most recognizable brands including Verizon, Electronic Arts, Sharp, FICO, the U.S. Navy, and Boeing. Nuxeo is headquartered in New York and Paris.\nMore information is available at [www.nuxeo.com](http://www.nuxeo.com).\n",
        "digest": "39f7ca370031a727e5ab6de2f97880f9",
        "encoding": "UTF-8",
        "length": 8567,
        "mimeType": "text/plain",
        "name": "README.md"
      },
      "requirements": [],
      "version": "2023.3.6"
    }
  ],
  "creationDate": 1732717764661,
  "key": "Nuxeo Platform-2023.22",
  "name": "Nuxeo Platform",
  "operations": [
    {
      "@type": "NXOperation",
      "aliases": [],
      "category": "Files",
      "contributingComponent": "org.nuxeo.coldstorage.operations.contrib",
      "description": "Move the main document content to the cold storage.",
      "hierarchyPath": "/op:Document.MoveToColdStorage",
      "label": "Move to Cold Storage",
      "name": "Document.MoveToColdStorage",
      "operationClass": "org.nuxeo.coldstorage.operations.MoveToColdStorage",
      "params": [],
      "signature": [
        "document",
        "document",
        "documents",
        "documents"
      ],
      "url": "Document.MoveToColdStorage",
      "version": "2023.22.13"
    },
    {
      "@type": "NXOperation",
      "aliases": [],
      "category": "Files",
      "contributingComponent": "org.nuxeo.coldstorage.operations.contrib",
      "description": "Request a retrieval from cold storage of the content associated with the document.",
      "hierarchyPath": "/op:Document.RequestRetrievalFromColdStorage",
      "label": "Request retrieval from cold storage",
      "name": "Document.RequestRetrievalFromColdStorage",
      "operationClass": "org.nuxeo.coldstorage.operations.RequestRetrievalFromColdStorage",
      "params": [
        {
          "description": "The number of days that you want your cold storage content to be accessible.",
          "isRequired": false,
          "name": "numberOfDaysOfAvailability",
          "order": 0,
          "type": "int",
          "values": [],
          "widget": null
        }
      ],
      "signature": [
        "document",
        "document",
        "documents",
        "documents"
      ],
      "url": "Document.RequestRetrievalFromColdStorage",
      "version": "2023.22.13"
    },
    {
      "@type": "NXOperation",
      "aliases": [],
      "category": "Files",
      "contributingComponent": "org.nuxeo.coldstorage.operations.contrib",
      "description": "Restore document under cold storage content to the main storage.",
      "hierarchyPath": "/op:Document.RestoreFromColdStorage",
      "label": "Restore from Cold Storage",
      "name": "Document.RestoreFromColdStorage",
      "operationClass": "org.nuxeo.coldstorage.operations.RestoreFromColdStorage",
      "params": [],
      "signature": [
        "document",
        "document",
        "documents",
        "documents"
      ],
      "url": "Document.RestoreFromColdStorage",
      "version": "2023.22.13"
    }
  ],
  "packages": [
    {
      "@type": "NXPackage",
      "bundles": [
        "org.nuxeo.coldstorage",
        "nuxeo-coldstorage-web"
      ],
      "conflicts": [],
      "dependencies": [
        "amazon-s3-online-storage",
        "nuxeo-web-ui"
      ],
      "hierarchyPath": "/nuxeo-coldstorage-2023.3.6",
      "id": "nuxeo-coldstorage-2023.3.6",
      "name": "nuxeo-coldstorage",
      "optionalDependencies": [],
      "packageType": "addon",
      "title": "Nuxeo Cold Storage",
      "version": "2023.3.6"
    }
  ],
  "pluginSnapshots": {},
  "releaseDate": 1732717764661,
  "version": "2023.22"
}